    /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.Ventas.Controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import net.sf.oval.ConstraintViolation;
import net.sf.oval.Validator;
import pe.edu.pucp.Modelo.Cliente;
import pe.edu.pucp.Modelo.EstadoCliente;
import pe.edu.pucp.Modelo.TipoCliente;
import pe.edu.pucp.Modelo.TipoCorreo;
import pe.edu.pucp.Modelo.TipoDocumento;
import pe.edu.pucp.Modelo.Usuario;
import pe.edu.pucp.Util.Constante;
import pe.edu.pucp.Util.LogHelper;
import pe.edu.pucp.Util.Utilitario;
import pe.edu.pucp.Util.ValHelper;
import pe.edu.pucp.Util.Validacion.ClienteVal;
import pe.edu.pucp.Ventas.DAO.ClientesDAO;
import pe.edu.pucp.Ventas.Vista.ClienteGUI;

/**
 *
 * @author katy
 */
public class ClientesControlador {
    private Cliente cliente;
    private ClientesDAO m;
    private ClienteGUI clientesView ;
    private ArrayList<TipoDocumento> lstTipoDocumento;
    private ArrayList<EstadoCliente> lstEstados;
    private ArrayList<TipoCliente> lstTipoCliente;
    private ArrayList<TipoCorreo> lstTipoCorreo;
    private Usuario user;
    private Validator validador;
    private int trans;
    
    public ClientesControlador(ClientesDAO dao, ClienteGUI v, Usuario u) {
       this.m = dao;
        this.clientesView = v;   
        this.user = u;
        this.validador = new Validator();
        trans = Constante.TRANSACCION_REGISTRO;
                
        loadCombos(this.cliente);
        bloquearElementos(lstTipoCliente.get(clientesView.getTipoCliente()));
        clientesView.addCancelButtonListener(new CancelButtonListener());
        clientesView.addGuardarButtonListener(new GuardarButtonListener());
        clientesView.addTipoClienteCmbListener(new TipoClienteCmbListener());
        clientesView.addSoloNumerosListener(new SoloNumerosListener());
        clientesView.addSoloTextoListener(new SoloTextoListener());
        clientesView.setEstadoGuardar("Registrar Cliente");
    }
  
    public ClientesControlador(ClientesDAO dao, ClienteGUI v, Usuario u, Cliente cliente) {
        this.cliente = cliente;
        this.m = dao;
        this.user = u;
        this.clientesView = v; 
        this.validador = new Validator();
        trans = Constante.TRANSACCION_MODIFICACION;
        
        loadCombos(this.cliente);
        bloquearElementos(lstTipoCliente.get(clientesView.getTipoCliente()));
        clientesView.setValues(this.cliente);
        clientesView.addCancelButtonListener(new CancelButtonListener());
        clientesView.addGuardarButtonListener(new GuardarButtonListener());
        clientesView.setEstadoGuardar("Editar Cliente");
    }
  
    private void bloquearElementos(TipoCliente t) {
        if(t.getDescripcion().toUpperCase().equals("EMPRESA")) {
            clientesView.setEnabledNombreApellidosTxt(false);
            clientesView.setEnabledRazonSocialTxt(true);
        } 
        else {
            clientesView.setEnabledNombreApellidosTxt(true);
            clientesView.setEnabledRazonSocialTxt(false);
        }
        if(this.cliente != null) {
            clientesView.setEnabledTipoClienteCmb(false);
        }
    }
    
    private void loadCombos(Cliente c) {
        llenarTipoDocs(c);
        llenarTipoCliente(c);
        llenarEstadosCliente(c);
        llenarTipoCorreo(c);
    }
    
    public void llenarTipoCliente(Cliente c) {
        lstTipoCliente = m.listarTipoCliente();
        clientesView.llenaTipoCliente(lstTipoCliente, c);
    }
    
    public void llenarEstadosCliente(Cliente c) {
        lstEstados = m.listarEstadosCliente();
        clientesView.llenaEstadosCliente(lstEstados, c);
    }
    
    public void llenarTipoDocs(Cliente c) {
        lstTipoDocumento = m.listarTipoDocs();
        clientesView.llenaTipoDocs(lstTipoDocumento, c);
    }
    
    public void llenarTipoCorreo(Cliente c) {
        lstTipoCorreo = m.listarTipoCorreo();
        clientesView.llenaTipoCorreo(lstTipoCorreo, c);
    }
    
    public Cliente getCliente(ClienteVal c) {
         if (cliente == null) {
                cliente = new Cliente();
                cliente.setFechareg(new Date());
                cliente.setCiudad(user.getAeropuerto().getCiudad());
            }
            
            TipoCliente t = lstTipoCliente.get(clientesView.getTipoCliente());
            cliente.setTipoCliente(t);
            
            if (!t.getDescripcion().toUpperCase().equals("EMPRESA")) {
                cliente.setNombre(c.getNombre());
                cliente.setAppaterno(c.getAppaterno());
                cliente.setApmaterno(c.getApmaterno());
            } else {
                cliente.setNombre(c.getNombre());
                cliente.setApmaterno("--");
                cliente.setAppaterno("--");
            }
            
            cliente.setTipoDocumento(lstTipoDocumento.get(clientesView.getTipoDocumento()));
            cliente.setNumdoc(c.getNumdoc());
            cliente.setEstadoCliente(lstEstados.get(clientesView.getEstado()));
            cliente.setTipoCorreo(lstTipoCorreo.get(clientesView.getTipoCorreo()));
            cliente.setCorreo(c.getCorreo());
            return cliente;
    }
    
    public void guardarCliente(Cliente e) {
        try {
          m.guardarCliente(cliente);
          if (trans == Constante.TRANSACCION_REGISTRO) { LogHelper.registrarOperacion(user, Constante.ACCION_REGISTRAR, Constante.OBJETO_CLIENTE, "Se registró el cliente con código "+e.getIdcliente()); }
          if (trans == Constante.TRANSACCION_MODIFICACION) { LogHelper.registrarOperacion(user, Constante.ACCION_MODIFICAR, Constante.OBJETO_CLIENTE, "Se modificó el cliente con código "+e.getIdcliente()); }
          ValHelper.mostrarAviso("Registro exitoso");
        } catch (Exception ex){
            ValHelper.mostrarError("Ocurrió un error: " + ex.getMessage());
         
        }
    }
    
    class SoloNumerosListener extends KeyAdapter {    
        @Override
        public void keyTyped(KeyEvent e) {
            ValHelper.soloDigito(e);
        }       
    }
    
    class TipoClienteCmbListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            TipoCliente t = lstTipoCliente.get(clientesView.getTipoCliente());
            bloquearElementos(t);
        }
   
    }
   
    class CancelButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            clientesView.dispose();
        }
  
    }
    
    class SoloTextoListener extends KeyAdapter {
        @Override
        public void keyTyped(KeyEvent e) {
            ValHelper.soloDigitoTexto(e);
        }     
    }
    
    class GuardarButtonListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            ClienteVal clienteVal = new ClienteVal();
            
            TipoCliente t = lstTipoCliente.get(clientesView.getTipoCliente());
            if (!t.getDescripcion().toUpperCase().equals("EMPRESA")) {
                clienteVal.setNombre(clientesView.getNombre());
                clienteVal.setAppaterno(clientesView.getApellidoPaterno());
                clienteVal.setApmaterno(clientesView.getApellidoMaterno());
            } else {
                clienteVal.setNombre(clientesView.getRazonSocial());
                clienteVal.setApmaterno("--");
                clienteVal.setAppaterno("--");
            }
            clienteVal.setNumdoc(clientesView.getNumeroDoc());
            clienteVal.setCorreo(clientesView.getCorreo());
                   
            List<ConstraintViolation> violations = validador.validate(clienteVal);
            if(violations.size()>0)
            {
                ValHelper.mostrarError(Utilitario.parsearMensajeError( violations.get(0).getMessage()));
            }
            else 
            {
                Cliente cliente = getCliente(clienteVal);
                guardarCliente(cliente);
                clientesView.dispose();
            }
        }
    }
}
